#include "spi1.h"
#include <stdio.h>

/**
 * @desc  : 初始化
 * @date  : 2024-12-04
 * @author: AnRui
 */
void SPI1_INIT() {
    /******************* GPIO **********************/
    // SCL
    RCC_AHB1PeriphClockCmd(SPI1_CLK_RCU, ENABLE);
    GPIO_InitTypeDef gpio_battery;
    gpio_battery.GPIO_Pin = SPI1_CLK_PIN;
    gpio_battery.GPIO_Speed = GPIO_Speed_50MHz;
    gpio_battery.GPIO_Mode = GPIO_Mode_AF;
    gpio_battery.GPIO_OType = GPIO_OType_PP;
    gpio_battery.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(SPI1_CLK_PORT, &gpio_battery);
    GPIO_WriteBit(SPI1_CLK_PORT, SPI1_CLK_PIN, Bit_RESET);
    // MOSI
    RCC_AHB1PeriphClockCmd(SPI1_MOSI_RCU, ENABLE);
    gpio_battery.GPIO_Pin = SPI1_MOSI_PIN;
    GPIO_Init(SPI1_MOSI_PORT, &gpio_battery);
    // MISO
    RCC_AHB1PeriphClockCmd(SPI1_MISO_RCU, ENABLE);
    gpio_battery.GPIO_Pin = SPI1_MISO_PIN;
    gpio_battery.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(SPI1_MISO_PORT, &gpio_battery);

    // 复用一定要打开
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1);  //PB3复用为SPI1
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1);  //PB4复用为SPI1
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);  //PB5复用为SPI1


    /******************* spi  ****************/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    SPI_InitTypeDef spi_struct;
    SPI_StructInit(&spi_struct);
    spi_struct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;    //全双工模式
    spi_struct.SPI_Mode = SPI1_MODE;  //主设备
    spi_struct.SPI_DataSize = SPI1_DATA_WIDTH; // 数据宽度
    spi_struct.SPI_CPOL = SPI1_CPOL; // 极性
    spi_struct.SPI_CPHA = SPI1_CPHA; // 相位
    spi_struct.SPI_NSS = SPI1_NSS; // cs 使用软实现
    spi_struct.SPI_BaudRatePrescaler = SPI1_BaudRatePrescaler; // 分频系数 根据从设备 可以进行调整
    spi_struct.SPI_FirstBit = SPI1_FirstBit; //  先发高位
    SPI_Init(SPI1, &spi_struct);
    SPI_Cmd(SPI1, ENABLE);
}

/**
 * @desc  : 写数据
 * @date  : 2024-12-04
 * @author: AnRui
 * @param :  data - {参数说明}:
 */
void SPI1_WRITE_BYTE(uint8_t data) {
    // 等待发送缓冲区为空
    while (RESET == SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)) {};
    SPI_I2S_SendData(SPI1, data);
    // 等待接收缓冲区不为空 发送的过程中 硬件电路也在接收 即便没使用
    while (RESET == SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)) {}
    SPI_I2S_ReceiveData(SPI1);
}

/**
 * @desc  : 读数据
 * @date  : 2024-12-04
 * @author: AnRui
 * @return: uint8_t
 */
uint8_t SPI1_READ_BYTE() {
    // 等待发送缓冲区为空
    while (RESET == SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)) {};
    SPI_I2S_SendData(SPI1, 0x00);
    // 等待接收缓冲区不为空
    while (RESET == SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)) {}
    return SPI_I2S_ReceiveData(SPI1);
}